package Lee_code;

import java.util.Arrays;

/**
 * @author blh
 * @date 2024年07月09日 8:21
 */
public class Lee_91_79 {
    public int numDecodings(String s) {
        int len = s.length();
        int[] dp = new int[len];
        /**
         * 两位数
         * > 26 -> 1
         * 21 - 26 ->2
         * 20 -> 1
         * 11 - 19 2
         * 10 -> 1
         * 一位数
         * 0 -> 0
         * 1 - 9 -> 1
         */
        // 前导0的存在
        if (s.charAt(0) != '0') {
            dp[0] = 1;
        } else {
            return 0;
        }
        if (len == 1) {
            return dp[0];
        }
        String str2 = s.substring(0, 2);
        int int2 = Integer.parseInt(str2);

        if (int2 > 26) {
            dp[1] = 1;
        } else if (21 <= int2) {
            dp[1] = 2;
        } else if (11 <= int2 && int2 <= 19) {
            dp[1] = 2;
        } else if (int2 == 10 || int2 == 20) {
            dp[1] = 1;
        }

        int max = Arrays.stream(dp).max().getAsInt();
        // 更新dp的原则
        for (int i = 2; i < len; i++) {
            if (s.charAt(i) != '0') {
                // 当前数字不为0
                if (s.charAt(i - 1) != '0') {
                    // 组合加入
                    String strTemp = s.substring(i - 1, i + 1);
                    int intTemp = Integer.parseInt(strTemp);
                    if (intTemp > 26) {
                        dp[i] = dp[i - 2];
                    } else if (21 <= intTemp) {
                        dp[i] = max + 2;
                    } else if (11 <= intTemp && intTemp <= 19) {
                        dp[i] = max + 2;
                    }
                } else {
                    dp[i] = dp[i - 1];
                }

            } else {
                // 当前数字为0
                // 不能单独出现
                // 组合加入
                String strTemp = s.substring(i - 1, i + 1);
                int intTemp = Integer.parseInt(strTemp);
                if (intTemp == 10 || intTemp == 20) {
                    dp[i] = dp[i - 2];
                } else {
                    return 0;
                }
            }
            max = Arrays.stream(dp).max().getAsInt();
        }
        return dp[len - 1];
    }
}
